//
//  UserAccountViewModel.swift
//  MicroBlog
//
//  Created by 002 on 15/10/18.
//  Copyright © 2015年 002. All rights reserved.
//

import Foundation

/// 用户账号视图模型 - 没有父类
/**
模型通常继承自 NSObject -> 可以使用 KVC 设置属性，简化对象构造
如果没有父类，所有的内容，都需要从头创建，量级更轻

视图模型的作用：封装`业务逻辑`，通常没有复杂的属性
*/

class UserAccountViewModel {
    
    // 单例，避免频繁从沙盒中读取，提高效率（从磁盘中读取比较慢）
    static let shareUserAccount = UserAccountViewModel()
    
    // 用户模型
    var account : UserAccount?
    
    // 令牌
    var accessToken : String? {
        
        // 如果过期就返回nil
        if isExpired {
            return nil
        } else {
            return account?.access_token
        }
    }
    
    // 用户登录标记
    var isUserLogin : Bool {
        
        // 1.->有access_token,说明授权登录成功
        // 2.->access_token未过期，说明有效
        return account?.access_token != nil && !isExpired
    }
    
    // 用户头像地址
    var avatar_url : NSURL {
        
        return NSURL(string: account?.avatar_large ?? "")!
    }
    // 判断授权是否过期
    private var isExpired : Bool {
        
        // 通常为了访问的安全，自己改写授权时间
        // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
        // account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        // 如果account为nil,不会调用后面的属性，后面的操作也不会执行
        if account?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            // 代码执行到此，一定进行过比较！
            return false
        }
        
        // 到此说明过期，返回true
        return true
    }
    
    // 归档保存的路径 - 计算型属性(类似于有返回值的函数，可以让调用的时候，语义会更清晰)
    private var accountPath : String {
        
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true
        ).last!
//        print("\(path)")
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    /// 构造函数
    /// 从沙盒解档数据（速度就慢，从需求分析来看，整个程序中需要一份就可以了）
    /// :returns: 当前对象
    init() {
//        print("\(accountPath)")
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
//        print(account)
        
        // 如果过期清空归档文件
        if isExpired {
            print("已经过期")            
            account = nil
        }
    }
}


// MARK: - 用户账户相关的网络方法
extension UserAccountViewModel {
    
    /// 加载令牌
    ///
    /// :param: code   授权码
    /// :param: finish 完成回调
    func loadAccessToken(code: String,finish:(isSucceed : Bool) -> ()) {
        
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            // 错误存在的话
            if error != nil {
                print("获取令牌出错")
                finish(isSucceed: false)
                return
            }
            
            // 返回的数据正误的判断
            guard let dict = result as? [String : AnyObject] else {
                print("数据格式错误")
                finish(isSucceed: false)
                return
            }
            
            // 创建用户对象保存在self.account中
            self.account = UserAccount.init(dict: dict)
            // 加载用户信息
            self.loadUserInfo(self.account!, finish: finish)
            print("\(self.account)")
        }
        
    }
    
    //MARK: 加载用户信息
    private func loadUserInfo(userAccount: UserAccount,finish:(isSucceed : Bool) -> ()) {
        
        NetworkTools.sharedTools.loadUserInfo(userAccount.uid!) { (result, error) -> () in
            
            if error != nil {
                
                print("加载用户出错")
                finish(isSucceed: false)
                return
            }
            
            guard let dict = result as? [String : AnyObject] else {
                
                print("数据格式错误")
                finish(isSucceed: false)
                return
            }
            
            // 将用户信息保存到所传的对象
            userAccount.screen_name = dict["screen_name"] as? String
            userAccount.avatar_large = dict["avatar_large"] as? String
            // 保存对象到本地
            NSKeyedArchiver.archiveRootObject(userAccount, toFile: self.accountPath)
            print("\(self.accountPath)")
            // 成功回调
            finish(isSucceed: true)
        }
    }

}